iT邦幫忙

2021 iThome 鐵人賽

DAY 23
0
Software Development

在麥塊的農場裡寫 Lua系列 第 23

Day23 CC: Tweaked 升級版的電腦

  • 分享至 

  • xImage
  •  

我圍繞在「基本版」電腦已經二十多天了 ...
一開始先試著熟悉 Lua 語法,接著玩轉電腦週邊設備,最後是網路架設
電腦的基本功能大概熟個十之八九了~
今天來讓電腦升級吧!
升級公式如下,你只要有滿滿的黃金,就可以有強大的電腦,這真是直白乾脆 XD
CC: Tweaked Advanced Computer

玩過一番之後,歸納 Advanced Computer 的幾個特點如下:

  1. 彩色螢幕
    雖然顏色沒有很多,但是單色變彩色還是讓人開心啊!
  2. 支援滑鼠
  3. 支援背景執行,可同時跑多個程式
  4. shell 視窗支援頁籤,可切換
  5. 在編輯視窗可直接執行

以下逐一介紹探索~

Advanced Computer 彩色螢幕與滑鼠

這部分的體驗,直接執行 paint 小小畫家即可,這也是 CC: Tweaked 預先設計好的小程式
位置在 /rom/programs/fun/advanced/paint.lua

paint mypicture

有大約 16 個顏色可選擇,滑鼠點右下角可切換色筆和橡皮擦
來展現一下我繪畫的功力 ......
CC: Tweaked Advanced Computer paint
................
不過它儲存後,不是真的變成圖檔,而是副檔名 nfp 的純文字檔
CC: Tweaked Advanced Computer paint save file

關於滑鼠的支援,還有一個是 CC: Tweaked 設計好的小品遊戲
位置在 /rom/programs/fun/advanced/redirection.lua
直接輸入即可開始遊玩

redirection

這裡順便介紹,Advanced Computer 因為支援滑鼠功能,也相對有滑鼠相關事件
mouse_click, mouse_drag, mouse_up 這三個事件發生時,都可取得 button, x 座標, y 座標
mouse_scroll 則是滑鼠滾輪事件,可取得方向 direction 和 x 座標, y 座標
這部分在 paint.lua 和 redirection.lua 都有直接的應用可參考

Advanced Computer 頁籤與多工執行

多頁籤的支援,是來自 /rom/programs/advanced/multishell.lua
判斷的部分則是在
bios.lua #977

-- Run the shell
local ok, err = pcall(parallel.waitForAny,
    function()
        local sShell
        if term.isColour() and settings.get("bios.use_multishell") then
            sShell = "rom/programs/advanced/multishell.lua"
        else
            sShell = "rom/programs/shell.lua"
        end
        os.run({}, sShell)
        os.run({}, "rom/programs/shutdown.lua")
    end,
    rednet.run
)

而背景與前景執行的部分,則可以使用 bg.lua 和 fg.lua
位置也是在 /rom/programs/advanced/
例如

bg gps locate

這樣就會自動開啟一個新的 Tab 去執行 GPS 定位,參考畫面如下
CC: Tweaked Advanced Computer background tabs

來順便看看 bg.lua 和 fg.lua 程式碼
bg.lua

if not shell.openTab then
    printError("Requires multishell")
    return
end

local tArgs = { ... }
if #tArgs > 0 then
    shell.openTab(table.unpack(tArgs))
else
    shell.openTab("shell")
end

fg.lua

if not shell.openTab then
    printError("Requires multishell")
    return
end

local tArgs = { ... }
if #tArgs > 0 then
    local nTask = shell.openTab(table.unpack(tArgs))
    if nTask then
        shell.switchTab(nTask)
    end
else
    local nTask = shell.openTab("shell")
    if nTask then
        shell.switchTab(nTask)
    end
end

從 bg, fg 原始碼可發現,必須支援 multishell 才可以跑,因為基本版的電腦無法執行
再來就是,兩個其實都是 shell.openTab
只是 fg 再多了個 shell.switchTab
所以事實上,它只是用 tabs 的視覺化來模擬前景和背景執行效果而已
你如果用 fg,仍然可以手動用滑鼠切換到原本的 tab

電腦怎麼知道要去哪找程式檔,以及是否可以執行?

如果你仔細研究,會發現不管是 Computer、Advanced Computer、Pocket Computer、Turtle
事實上大家在 rom 裡面放的程式碼和檔案都是完全一樣的!
差別只在於預設搜尋程式的路徑不同,或是有的程式可以執行,有的不行!

除了前面看過的 shell.openTab、term.isColour() 和 settings.get("bios.use_multishell")
我們再來看看
startup.lua #4

local sPath = ".:/rom/programs"
if term.isColor() then
    sPath = sPath .. ":/rom/programs/advanced"
end
if turtle then
    sPath = sPath .. ":/rom/programs/turtle"
else
    sPath = sPath .. ":/rom/programs/rednet:/rom/programs/fun"
    if term.isColor() then
        sPath = sPath .. ":/rom/programs/fun/advanced"
    end
end
if pocket then
    sPath = sPath .. ":/rom/programs/pocket"
end
if commands then
    sPath = sPath .. ":/rom/programs/command"
end
if http then
    sPath = sPath .. ":/rom/programs/http"
end
shell.setPath(sPath)
help.setPath("/rom/help")

sPath 變數就是我們直接輸入指令的時候,電腦預設要搜尋的資料夾位置
就我所知,turtle、pocket、commands 實際的值會是空的 table
我猜這是在 Java 階段就賦予的值,分別可代表 Turtle、Pocket Computer、Command Computer
term.isColor() 則代表則 Advanced Computer
因此,不同的工具在執行時,會自動在不同的路徑搜尋,不會錯亂

Advanced Computer + Advanced Monitor

Advanced Monitor 其實就是彩色版的螢幕,為了搭配 Advanced Computer
如果你將 Advanced Computer 接上基本版的螢幕,會發現無法在大螢幕上執行 paint 繪圖
除此之外,接上大的 Advanced Monitor 之後,你甚至可以直接在大螢幕上作畫
依靠的是螢幕本上的 monitor_touch 事件

這邊我只給大家參考畫面,請大家自行嘗試了XD
CC: Tweaked Advanced Monitors

而因為電腦接了三台螢幕,各有不同的名稱,我實際上執行的指令如下

bg monitor monitor_5 paint mypicture
bg monitor monitor_4 edit receiver.lua
bg monitor monitor_2 edit speaker.lua

今天分享到這裡,謝謝大家收看~


上一篇
Day22 高階網路應用 GPS 和 Ender Modem
下一篇
Day24 麥塊裡的彩色大螢幕和 GIF 動畫
系列文
在麥塊的農場裡寫 Lua30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言